/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mxgraph.io.vdx;

import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import java.util.HashMap;
import java.util.List;

/**
 * This class is a wrapper for a Master element.<br/>
 * Contains a map with the shapes contained in the Master element
 * and allows access these by ID.
 */
public class mxMasterElement {
    private Element master;

    /*
      * Map that contains the shapes in Master element wrapped for instances of mxMasterShape.
      * The key is the shape's ID.
      */
    private HashMap<String, mxMasterShape> masterShapes = new HashMap<String, mxMasterShape>();

    /**
     * Create a new instace of mxMasterElement and retrieves all the shapes contained
     * in the Master element.
     *
     * @param m Master Element to be wrapped.
     */
    public mxMasterElement(Element m) {
        this.master = m;
        this.masterShapes = retrieveMasterShapes(masterShapes, this.master);
    }

    /**
     * Retrieves and wraps all the shapes contained in the 'shape' param.<br/>
     * This method is recursive, it retrieves the subshapes of the shapes too.
     *
     * @param masterShps Map where the shapes must be placed.
     * @param shape      Shape from wich the subshapes are retrieved.
     * @return Map with the shapes wrapped in instances of mxMasterShape.
     */
    private HashMap<String, mxMasterShape> retrieveMasterShapes(
            HashMap<String, mxMasterShape> masterShps, Element shape) {
        NodeList childrens = shape.getChildNodes();

        if (mxVdxUtils.nodeListHasTag(childrens, "Shapes")) {
            Element shps = mxVdxUtils.nodeListTag(childrens, "Shapes");
            NodeList shpsList = shps.getChildNodes();

            List<Element> shapeList = mxVdxUtils
                    .nodeListTags(shpsList, "Shape");

            for (int i = 0; i < shapeList.size(); i++) {
                Element shp = shapeList.get(i);
                String shapeId = shp.getAttribute("ID");
                mxMasterShape masterShape = new mxMasterShape(shp);
                masterShps.put(shapeId, masterShape);
                masterShps = retrieveMasterShapes(masterShps, shp);
            }
        }
        return masterShps;
    }

    /**
     * Returns the first shape in the Master
     *
     * @return First shape in the Master wrapped in a instance of mxMasterShape
     */
    public mxMasterShape getMasterShape() {
        return getMasterShape(null);
    }

    /**
     * Returns the shape in the master element with ID = 'id'.
     *
     * @param id Shape's ID
     * @return The shape in the master element with ID = 'id' wrapped in a instance of mxMasterShape
     */
    public mxMasterShape getMasterShape(String id) {
        mxMasterShape ret = masterShapes.get(id);
        if (ret == null) {
            ret = (mxMasterShape) masterShapes.values().toArray()[0];
        }
        return ret;
    }

    /**
     * Returns the NameU attribute.
     *
     * @return Value of the NameU attribute.
     */
    public String getNameU() {
        String nameU = "";
        if (master.hasAttribute("NameU"))
		{
			nameU = master.getAttribute("NameU");
		}
		return nameU;
	}
}
